package main

import (
	"fmt"
	"os"
)

func main() {
	/* 这个是说 这个range的位置能产生一对值 索引和索引处对应的值 要是你不用索引就必须要用 _ 承接 就是不能空着    然后那个os.Args[1:] 就是有点像数组的 和python那种处理差不多*/
	fmt.Println(os.Args[1:])

	s, sep := "", ""
	for _, arg := range os.Args[1:] {
		s += sep + arg
		//sep = " "
	}

	fmt.Println(s)

	// 包含一个 statement 可选语句部分，该组件在条件判断之前运行。它的语法是：
	// 比如这样  就是ok为false 或者是 yv!= xv的时候 执行return

	yk := false
	xv := true
	if yv, ok := yk, true; !ok || yv != xv {
		fmt.Println(yk, xv)
	}

	// 这里的指针和 c语言的指针一样
	v := 1
	fmt.Println(&v)
	incr(&v)              // side effect: v is now 2  这个是把变量去地址 然后传给incr，
	fmt.Println(incr(&v)) // "3" (and v is 3)  又传了一次 所以最后就是3
	fmt.Println(&v)       // 地址前后不变的

	// make和new 都是关于指针相关的创建
	/**
	new() 用于创建指定类型的零值变量，并返回该变量的指针。
	make() 用于创建并初始化引用类型的变量，如切片、映射和通道。
	new() 用于创建任意类型的变量，而 make() 仅用于创建引用类型的变量。
	new() 返回的是指针，而 make() 返回的是初始化后的值。
	new() 创建的变量是零值，make() 创建的变量是根据类型进行初始化。
	*/
	p := new(int)   // p, *int 类型, 指向匿名的 int 变量
	fmt.Println(*p) // "0"
	fmt.Println(p)
	*p = 2          // 设置 int 匿名变量的值为 2
	fmt.Println(*p) // "2"

	// make(type, length, capacity)
	// 创建一个长度为5，容量为10的int类型切片
	lice := make([]int, 5, 10)
	fmt.Println(lice)      // [0 0 0 0 0]
	fmt.Println(len(lice)) // 5
	fmt.Println(cap(lice)) // 10

}

// 首先是一个叫incr的函数 后边的（p *int）是说 有一个p变量 类型是地址 返回值是 int
func incr(p *int) int {
	*p++      // 非常重要：只是增加p指向的变量的值，并不改变p指针！！！
	return *p //把对应地址的那个值返回
}
